package com.yuqian.JavaSe.java.scollection;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * ArrayList以数组实现，允许重复。超出限制时会增加50%的容量（grow()方法中实现，如下所示），
 * 每次扩容都底层采用System.arrayCopy()复制到新的数组，因此最好能给出数组大小的预估值。
 * 默认第一次插入元素时创建数组的大小为10.
 *
 *
 *直接在数组末尾加入元素—add(e)的性能也高，但如果按下标插入、删除元素—add(i,e), remove(i), remove(e)，
 *则要用System.arraycopy()来移动部分受影响的元素，性能就变差了，这是基本劣势。
 */
public class SArrayList {
	public static void main(String[] args) {
		//ArrayList<Integer> list= new ArrayList<Integer>();
		
		//考虑这样一种情形，当某个应用需要，一个ArrayList扩容到比如size=10000，之后经过一系列remove操作size=15，在后面的很长一段时间内这个ArrayList的size一直保持在<100以内，那么就造成了很大的空间浪费，这时候建议显式调用一下trimToSize()这个方法，以优化一下内存空间。
		//或者在一个ArrayList中的容量已经固定，但是由于之前每次扩容都扩充50%，所以有一定的空间浪费，可以调用trimToSize()消除这些空间上的浪费。
		//list.trimToSize();
		
		//语法糖：语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法，
		//它只是编译器实现的一些小把戏罢了，编译期间以特定的字节码或者特定的方式对这些语法做一些处理，
		//开发者就可以直接方便地使用了。这些语法糖虽然不会提供实质性的功能改进，但是它们或能提高性能、
		//或能提升语法的严谨性、或能减少编码出错的机会。Java提供给了用户大量的语法糖，比如泛型、自动装箱、
		//自动拆箱、foreach循环、变长参数、内部类、枚举类、断言（assert）等。 
		
		//对有实现Iterable接口的对象采用foreach语法糖的话，编译器会将这个for关键字转化为对目标的迭代器使用。 
		
		List<String> list = new ArrayList<String>();
        list.add("s1");
        list.add("s2");

        for(String s : list)
        {
            System.out.println(s);
        }
        //转换为：
        for(java.util.Iterator i$ = list.iterator(); i$.hasNext();)
        {
            String s = (String) i$.next();
            {
                System.out.println(s);
            }
        }
        
        //这里大家可能会有疑问，java数组就没有实现Iterable接口，为什么数组可以实现foreach呢
        //其实编译器对数组也实现了foreach，直接编译成对数组的遍历
        
        
        
        /**
         * 还有一点需要注意的对于实现RandomAccess接口的类
         *实际经验证明，如果是下列情况，则 List 实现应该实现此接口，即对于典型的类实例而言，此循环： 
		     for (int i=0, n=list.size(); i < n; i++)
		         list.get(i);
		 的运行速度要快于以下循环： 
		     for (Iterator i=list.iterator(); i.hasNext(); )
		         i.next();
			实现RandomAccess接口的类ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, Stack, Vector 

         */
	}
}
